#!usr/bin/env node

const log=console.log,
  stdin=process.stdin, 
  exit=process.exit, 
  arg=process.argv, 
  help='帮助你';

var p=[];
var i=0;

if(arg.length == 3 && (arg[2] === '-h' || arg[2] === '--help')) {
  log(help);
  exit();
}

if(arg.length > 2 && validata()){
  log('\np=%j\n',p);
  log(`h(p)=${roundFractional(h(p),2)} bit`);
  exit();
}

p=[];

log('请输入信源概率分布：(Ctrl+D 退出输入)\np%d:', i);

stdin.on('data', (data) => {

  if(validataPi(data)){
    p.push(Number(data));
    
  }

 
  if(sigma(p) === 1) {
    log('\np = %j\n', p);
    log(`h(p) = ${roundFractional(h(p), 3)} bit`);
    exit();
  } else {
    log('p%d:', ++i);
  }
});
//什么都不输入时就会触发end事件
//有问题
stdin.on('end', () => {
 log('结束');
});


function validata(){
  if(arg.length===3){//以逗号分隔
    p=arg[2].split(',');
  }else{ //以空格分隔
    for(var i=2;i<arg.length;i++){ 
      p.push(arg[i]);
    }
  }

  if(p.length<2){ //不是很合理，只输入1也可以啊
    console.log('命令行参数错误\n');
    return false;
  }

  for(i=0;i<p.length;i++){ //验证每个数据的合法性
    if(!validataPi(p[i])){ 
      log('出错了！');
      return false;
    }
  }

  if(sigma(p)!==1){ 
    log('概率空间不封闭');
    return false;
  }

  //如果所有条件都满足？
  for(var i=0;i<p.length;i++){
    p[i]=Number(p[i]);
  }
  return true;

}


function sigma(p) {
  return p.reduce((total, pi) => {//求和
    return roundFractional(total + Number(pi), 2);
  }, 0);
}



function validataPi(data){
 
  if(isNaN(Number(data))) { log('请输入数字！');        return false; } 
  if(Number(data) < 0)    { log('请输入大于 0 的数！'); return false; } 
  if(Number(data) > 1)    { log('请输入小于 1 的数！'); return false; } 
  if(sigma(p) > 1)        { log('概率和超过了 1！');    return false; }

  return true;
}


//计算信源熵
function h(p){ 
  return p.reduce((total,pi)=>{
    return total - pi*Math.log2(pi);
  },0);
}

//保留小数
function roundFractional(x,n){
  return Math.round(x*Math.pow(10,n))/Math.pow(10,n);
}




